#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO] $1${NC}"
}

log_warn() {
    echo -e "${YELLOW}[WARN] $1${NC}"
}

log_error() {
    echo -e "${RED}[ERROR] $1${NC}"
}

# 检查系统要求
check_system_requirements() {
    log_info "检查系统要求..."
    
    # 检查操作系统
    if [ -f /etc/redhat-release ]; then
        local os_version=$(cat /etc/redhat-release | grep -oE '[0-9]+\.[0-9]+' | head -1)
        if [ $(echo "$os_version < 8.0" | bc) -eq 1 ]; then
            log_error "不支持的操作系统版本: $os_version"
            exit 1
        fi
    elif [ -f /etc/lsb-release ]; then
        local os_version=$(cat /etc/lsb-release | grep DISTRIB_RELEASE | cut -d= -f2)
        if [ $(echo "$os_version < 20.04" | bc) -eq 1 ]; then
            log_error "不支持的操作系统版本: $os_version"
            exit 1
        fi
    else
        log_error "不支持的操作系统"
        exit 1
    fi
    
    # 检查内存
    local total_mem=$(free -m | awk '/^Mem:/{print $2}')
    if [ $total_mem -lt 8192 ]; then
        log_error "内存不足: 需要至少 8GB 内存"
        exit 1
    fi
    
    # 检查 CPU
    local cpu_cores=$(nproc)
    if [ $cpu_cores -lt 4 ]; then
        log_error "CPU 核心数不足: 需要至少 4 核"
        exit 1
    fi
    
    # 检查磁盘
    local disk_space=$(df -BG / | awk 'NR==2 {print $4}' | sed 's/G//')
    if [ $disk_space -lt 50 ]; then
        log_error "磁盘空间不足: 需要至少 50GB 空间"
        exit 1
    fi
    
    log_info "系统要求检查通过"
}

# 安装依赖
install_dependencies() {
    log_info "安装依赖..."
    
    if [ -f /etc/redhat-release ]; then
        # CentOS/RHEL
        yum install -y yum-utils
        yum-config-manager --add-repo https://download.ceph.com/rpm-octopus/el8/noarch/
        yum install -y epel-release
        yum install -y python3 python3-pip python3-setuptools
        yum install -y chrony
    elif [ -f /etc/lsb-release ]; then
        # Ubuntu
        apt-get update
        apt-get install -y apt-transport-https ca-certificates curl software-properties-common
        curl -fsSL https://download.ceph.com/keys/release.asc | apt-key add -
        add-apt-repository "deb https://download.ceph.com/debian-octopus/ $(lsb_release -sc) main"
        apt-get update
        apt-get install -y python3 python3-pip python3-setuptools
        apt-get install -y chrony
    fi
    
    log_info "依赖安装完成"
}

# 配置时间同步
configure_chrony() {
    log_info "配置时间同步..."
    
    # 配置 chrony
    cat > /etc/chrony.conf << EOF
pool pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.0.0/16
local stratum 10
EOF
    
    # 重启 chrony 服务
    systemctl restart chronyd
    systemctl enable chronyd
    
    log_info "时间同步配置完成"
}

# 安装 Ceph
install_ceph() {
    log_info "安装 Ceph..."
    
    if [ -f /etc/redhat-release ]; then
        # CentOS/RHEL
        yum install -y ceph-common ceph-mon ceph-osd ceph-mds ceph-radosgw
    elif [ -f /etc/lsb-release ]; then
        # Ubuntu
        apt-get install -y ceph-common ceph-mon ceph-osd ceph-mds ceph-radosgw
    fi
    
    log_info "Ceph 安装完成"
}

# 配置 Ceph
configure_ceph() {
    local mon_ip=$1
    local public_network=$2
    local cluster_network=$3
    
    log_info "配置 Ceph..."
    
    # 创建配置目录
    mkdir -p /etc/ceph
    
    # 生成配置文件
    cat > /etc/ceph/ceph.conf << EOF
[global]
fsid = $(uuidgen)
mon initial members = $(hostname)
mon host = $mon_ip
public network = $public_network
cluster network = $cluster_network
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 128
osd pool default pgp num = 128
osd crush chooseleaf type = 1
EOF
    
    # 生成监控节点密钥
    ceph-authtool --create-keyring /etc/ceph/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
    
    # 生成管理员密钥
    ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *'
    
    # 生成 bootstrap-osd 密钥
    ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
    
    # 生成 bootstrap-rgw 密钥
    ceph-authtool --create-keyring /var/lib/ceph/bootstrap-rgw/ceph.keyring --gen-key -n client.bootstrap-rgw --cap mon 'profile bootstrap-rgw' --cap mgr 'allow r'
    
    # 生成 bootstrap-mds 密钥
    ceph-authtool --create-keyring /var/lib/ceph/bootstrap-mds/ceph.keyring --gen-key -n client.bootstrap-mds --cap mon 'profile bootstrap-mds' --cap mgr 'allow r'
    
    # 生成 monitor map
    monmaptool --create --add $(hostname) $mon_ip --fsid $(cat /etc/ceph/ceph.conf | grep fsid | awk '{print $3}') /tmp/monmap
    
    # 创建监控节点数据目录
    mkdir -p /var/lib/ceph/mon/ceph-$(hostname)
    
    # 初始化监控节点
    ceph-mon --mkfs -i $(hostname) --monmap /tmp/monmap --keyring /etc/ceph/ceph.mon.keyring
    
    # 启动监控节点服务
    systemctl start ceph-mon@$(hostname)
    systemctl enable ceph-mon@$(hostname)
    
    # 清理临时文件
    rm -f /tmp/monmap
    
    log_info "Ceph 配置完成"
}

# 创建存储池
create_pools() {
    log_info "创建存储池..."
    
    # 创建 .rgw.root 存储池
    ceph osd pool create .rgw.root 64 64
    
    # 创建 default.rgw.control 存储池
    ceph osd pool create default.rgw.control 64 64
    
    # 创建 default.rgw.meta 存储池
    ceph osd pool create default.rgw.meta 64 64
    
    # 创建 default.rgw.log 存储池
    ceph osd pool create default.rgw.log 64 64
    
    # 创建 default.rgw.buckets.index 存储池
    ceph osd pool create default.rgw.buckets.index 64 64
    
    # 创建 default.rgw.buckets.data 存储池
    ceph osd pool create default.rgw.buckets.data 128 128
    
    # 创建 cephfs_data 存储池
    ceph osd pool create cephfs_data 128 128
    
    # 创建 cephfs_metadata 存储池
    ceph osd pool create cephfs_metadata 64 64
    
    log_info "存储池创建完成"
}

# 创建文件系统
create_filesystem() {
    log_info "创建文件系统..."
    
    # 创建 CephFS
    ceph fs new cephfs cephfs_metadata cephfs_data
    
    log_info "文件系统创建完成"
}

# 创建 RGW 用户
create_rgw_user() {
    log_info "创建 RGW 用户..."
    
    # 创建 RGW 用户
    radosgw-admin user create --uid=admin --display-name="Admin User" --system
    
    log_info "RGW 用户创建完成"
}

# 主函数
main() {
    # 检查参数
    if [ $# -ne 3 ]; then
        log_error "用法: $0 <mon_ip> <public_network> <cluster_network>"
        exit 1
    fi
    
    local mon_ip=$1
    local public_network=$2
    local cluster_network=$3
    
    # 检查系统要求
    check_system_requirements
    
    # 安装依赖
    install_dependencies
    
    # 配置时间同步
    configure_chrony
    
    # 安装 Ceph
    install_ceph
    
    # 配置 Ceph
    configure_ceph "$mon_ip" "$public_network" "$cluster_network"
    
    # 创建存储池
    create_pools
    
    # 创建文件系统
    create_filesystem
    
    # 创建 RGW 用户
    create_rgw_user
    
    log_info "Ceph 集群安装完成"
}

# 执行主函数
main "$@" 